<template>
  <div :class="prefixCls" class="relative w-full h-full px-4">
    <div class="flex items-center absolute right-4 top-4">
      <AppDarkModeToggle class="enter-x mr-2" v-if="!sessionTimeout" />
      <AppLocalePicker
        class="text-white enter-x xl:text-gray-600"
        :show-text="false"
        v-if="!sessionTimeout && showLocale"
      />
    </div>

    <div class="container relative h-full py-2 mx-auto sm:px-10">
      <div class="flex h-full">
        <div class="hidden min-h-full pl-4 mr-4 xl:flex xl:flex-col xl:w-6/14">
          <AppLogo class="-enter-x" />
          <div class="my-auto">
            <img :alt="title" src="@/assets/svg/login-box-bg.svg" class="w-1/2 -mt-16 -enter-x" />
            <div class="mt-10 font-medium text-white -enter-x">
              <span class="inline-block mt-4 text-3xl"> {{ t('sys.login.signInTitle') }}</span>
            </div>
            <div class="mt-5 font-normal text-white dark:text-gray-500 -enter-x">
              {{ t('sys.login.signInDesc') }}
            </div>
          </div>
        </div>
        <div class="flex w-full h-full py-5 xl:h-auto xl:py-0 xl:my-0 xl:w-8/14">
          <div
            :class="`${prefixCls}-form`"
            class="relative w-full px-5 py-8 mx-auto my-auto rounded-md shadow-md xl:ml-16 xl:bg-transparent sm:px-8 xl:p-4 xl:shadow-none sm:w-3/4 lg:w-2/4 xl:w-auto enter-x"
          >
            <div>
              <LoginFormTitle class="enter-x" />
              <Form class="p-4 enter-x" :model="formData" ref="formRef">
                <FormItem name="doctorName" class="enter-x">
                  <Input
                    size="large"
                    :value="formData.doctorName"
                    :placeholder="t('sys.login.nickName')"
                    disabled
                    class="fix-auto-fill"
                  />
                </FormItem>
                <FormItem name="doctorIdentity" class="enter-x">
                  <Input
                    size="large"
                    class="fix-auto-fill"
                    v-model:value="formData.doctorIdentity"
                    :placeholder="t('sys.login.identity')"
                  />
                </FormItem>

                <FormItem class="enter-x mb-0">
                  <Button type="primary" size="large" block @click="handleLogin" :loading="loading">
                    {{ t('sys.login.loginButton') }}
                  </Button>
                </FormItem>
              </Form>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>
<script lang="ts" setup>
  import { getContractInfoApi } from '@/api/contract';
  import { AppDarkModeToggle, AppLocalePicker, AppLogo } from '@/components/Application';
  import { useGlobSetting } from '@/hooks/setting';
  import { useDesign } from '@/hooks/web/useDesign';
  import { useI18n } from '@/hooks/web/useI18n';
  import { useMessage } from '@/hooks/web/useMessage';
  import { useGo } from '@/hooks/web/usePage';
  import { useLocaleStore } from '@/store/modules/locale';
  import { useDoctorStore } from '@/store/modules/signature';
  import { isDevMode } from '@/utils/env';
  import LoginFormTitle from '@/views/sys/login/LoginFormTitle.vue';
  import { useFormValid } from '@/views/sys/login/useLogin';
  import { Form, Input, Button } from 'ant-design-vue';
  import { computed, onMounted, reactive, ref } from 'vue';
  import { useRoute } from 'vue-router';

  defineProps({
    sessionTimeout: {
      type: Boolean,
    },
  });

  onMounted(() => {
    const { id } = route.params || {};
    getContractInfoApi(id).then((res) => {
      formData.doctorName = res.doctorName;
      formData.origin = res;

      if (isDevMode()) setDoctorInfo(res);
    });
  });

  const formRef = ref();
  const loading = ref(false);

  const formData = reactive({
    doctorName: '',
    doctorIdentity: '',
    origin: {} as any,
  });

  const globSetting = useGlobSetting();
  const { prefixCls } = useDesign('login');
  const { t } = useI18n();
  const localeStore = useLocaleStore();
  const { createErrorModal } = useMessage();

  const { setDoctorInfo } = useDoctorStore();
  const { validForm } = useFormValid(formRef);
  const route = useRoute();
  const go = useGo();

  const showLocale = localeStore.getShowPicker;
  const FormItem = Form.Item;

  const title = computed(() => globSetting?.title ?? '');

  async function handleLogin() {
    const data = await validForm();
    if (!data) return;
    if (data.doctorIdentity != formData.origin?.doctorIdentity) {
      createErrorModal({
        title: '警告',
        content: '输入的身份证号与手机号拥有人的身份证号不符，请检查后后重试',
      });
      return;
    }

    setDoctorInfo(formData.origin);
  }
</script>
<style lang="less">
  @prefix-cls: ~'@{namespace}-login';
  @logo-prefix-cls: ~'@{namespace}-app-logo';
  @countdown-prefix-cls: ~'@{namespace}-countdown-input';
  @dark-bg: #293146;

  html[data-theme='dark'] {
    .@{prefix-cls} {
      background-color: @dark-bg;

      &::before {
        background-image: url('@/assets/svg/login-bg-dark.svg');
      }

      .ant-input,
      .ant-input-password {
        background-color: #232a3b;
      }

      .ant-btn:not(.ant-btn-link, .ant-btn-primary) {
        border: 1px solid #4a5569;
      }

      &-form {
        background: transparent !important;
      }

      .app-iconify {
        color: #fff;
      }

      .ant-divider-inner-text {
        color: @text-color-secondary;
      }
    }
  }

  .@{prefix-cls} {
    min-height: 100%;
    overflow: hidden;

    /* stylelint-disable-next-line media-query-no-invalid */
    @media (max-width: @screen-xl) {
      background-color: #293146;

      .@{prefix-cls}-form {
        background-color: #fff;
      }
    }

    &::before {
      position: absolute;
      top: 0;
      left: 0;
      margin-left: -48%;
      width: 100%;
      height: 100%;
      background-position: 100%;
      background-repeat: no-repeat;
      background-size: auto 100%;
      content: '';
      background-image: url('@/assets/svg/login-bg.svg');
      /* stylelint-disable-next-line media-query-no-invalid */
      @media (max-width: @screen-xl) {
        display: none;
      }
    }

    .@{logo-prefix-cls} {
      position: absolute;
      top: 12px;
      height: 30px;

      &__title {
        font-size: 16px;
        color: #fff;
      }

      img {
        width: 32px;
      }
    }

    .container {
      .@{logo-prefix-cls} {
        width: 60%;
        height: 80px;
        display: flex;

        &__title {
          font-size: 24px;
          color: #fff;
        }

        img {
          width: 48px;
        }
      }
    }

    &-sign-in-way {
      .anticon {
        font-size: 22px;
        color: #888;
        cursor: pointer;

        &:hover {
          color: @primary-color;
        }
      }
    }

    input:not([type='checkbox']) {
      min-width: 360px;
      /* stylelint-disable-next-line media-query-no-invalid */
      @media (max-width: @screen-xl) {
        min-width: 320px;
      }
      /* stylelint-disable-next-line media-query-no-invalid */
      @media (max-width: @screen-lg) {
        min-width: 260px;
      }
      /* stylelint-disable-next-line media-query-no-invalid */
      @media (max-width: @screen-md) {
        min-width: 240px;
      }
      /* stylelint-disable-next-line media-query-no-invalid */
      @media (max-width: @screen-sm) {
        min-width: 160px;
      }
    }

    .@{countdown-prefix-cls} input {
      min-width: unset;
    }
  }
</style>
